const fp = require('loadsh/fp')
// 数据
// horsepower 马力  dollar_value 价格  in_stock 库存
const cars = [
    {name:'Ferrari FF', horsepower:660, dollar_value: 700000, in_stock: true},
    {name:'Spyker C12 Zagato', horsepower:650, dollar_value: 648000, in_stock: false},
    {name:'Jaguar XKR-S', horsepower:550, dollar_value: 132000, in_stock: false},
    {name:'Audi R8', horsepower:525, dollar_value: 114200, in_stock: false},
    {name:'Aston Martin One-77', horsepower:750, dollar_value: 185000, in_stock: true},
    {name:'Pagani Huayra', horsepower:700, dollar_value: 130000, in_stock: false},
]

// 第一题  使用函数组合 fp.flowRight() 重新实现下面函数
let isLastInStock = function(cars){
    // 获取最后一条数据
    let last_car = fp.last(cars)
    // 获取最后一条数据的 in_stock 值
    return fp.prop('in_stock',last_car)
}

let newIsLastInStock1 = fp.flowRight(fp.prop('in_stock'), fp.last)
console.log('原题 isLastInStock:', isLastInStock(cars))
console.log('第一题 newIsLastInStock1:', newIsLastInStock1(cars))

// 第二题
// 使用 fp.flowRight() fp.prop() 和 fp.first() 获取第一个 car 的 name
let newIsLastInStock2 = fp.flowRight(fp.prop('name'), fp.first)
console.log('第二题答案newIsLastInStock2 获取第一个 car 的 name :', newIsLastInStock2(cars))

// 第三题
// 使用帮助函数 _average 重构 averageDollarValue, 使用函数组合的方式实现
let _average = function(xs){
    return fp.reduce(fp.add, 0, xs) / xs.length
}
let averageDollarValue = function(cars){
    let dollar_values = fp.map(function(car){
        return car.dollar_value
    },cars)
    return _average(dollar_values)
}

let newAverageDollarValue = fp.flowRight(_average, fp.map(fp.prop('dollar_value')))
console.log('原题 averageDollarValue:', averageDollarValue(cars))
console.log('第三题答案 newAverageDollarValue:', newAverageDollarValue(cars))

// 练习 4
// 使用 flowRight 写一个 sanitizeNames() 函数，返回一个下划线连接的小写的字符串，把数组中的 name 转换成这种形式：
// 例如： sanitizeNames(["Hello World"]) => ["hello_world"]
let _underscore = fp.replace(/\W+/g, '_')

let sanitizeNames = fp.flowRight(fp.map(_underscore), fp.map(fp.toLower), fp.map(fp.prop('name')))
console.log('第四题答案 sanitizeNames:', sanitizeNames(cars))
